# -*- coding:utf-8 -*-
'''
对于两个字符串，请设计一个高效算法，求他们的最长公共子序列的长度，
这里的最长公共子序列定义为有两个序列U1,U2,U3...Un和V1,V2,V3...Vn,
其中Ui&ltUi+1，Vi&ltVi+1。且A[Ui] == B[Vi]。

给定两个字符串A和B，同时给定两个串的长度n和m，请返回最长公共子序列的长度。保证两串长度均小于等于300。
'''
class LCS:
    def findLCS(self, A, n, B, m):
        # write code here
        if n==0 or m==0:
            return 0
        f = [[0] * (m+1) for _ in range(n+1)]
        f[0][0]=1
        for i in range(1,n+1):
            for j in range(1,m+1):
                if A[i-1]==B[j-1]:
                    f[i][j] =f[i-1][j-1]+1
                else:
                    f[i][j] = max(f[i-1][j],f[i][j-1])
        print(f)
        return f[-1][-1]

s = LCS()
m=s.findLCS("1A2C3D4B56",10,"B1D23CA45B6A",12)
print(m)